//数据校验的Class,theform 为表单对象
function myValidator(theform){
	this.vform=theform;
	var count=0;
	this.errItem=new Array(count);
	this.errMsg=new Array(count);
	this.errCount=0;
	this.isError=false;
	var obj=this.vform;
	this.objElement;
	
	if (typeof(theform)=="object"){
		count=theform.elements.length;
	}else{
		this.errMsg[0]="";	
	}
	
	for(var i=0;i<count;i++){
		this.errMsg[i]=""
	}
	
	//清除错误信息
	this.ClearState=function(elem){
	    with(elem){
	       if(style.color == "red")
	            style.color = "";
	        var lastNode = parentNode.childNodes[parentNode.childNodes.length-1];
	        if(lastNode.id == "__ErrorMessagePanel")
	           parentNode.removeChild(lastNode);
	   }
	}
	//测试正则表达式
	this.TestReg=function(op, reg){	
    		return new RegExp(reg,"g").test(op);
	}
	
	//增加错误对象描述信息
	this.AddErrorMsg=function(msg){		
		this.errMsg[this.errCount]+=msg;
		this.isError=true;
	}
	
	//校验是否需要校验数据
	this.isNeedCheck=function(verify,vStr){
		//是必填项的话校验
		if(verify.indexOf("M")>-1 && verify.indexOf(vStr)>-1){
			return true;
		}
		//非必填项，但是输了之后必须校验数据格式
		if(this.objElement.value!="" && verify.indexOf(vStr)>-1){
			return true;			
		}
		return false;
	}
	//输出错误信息
	this.OutputErrMsg=function(){
		//只校验一个元素
		if(typeof(theform)=="undefined"){
			this.errItem[0]=this.objElement;
			this.errCount=1;
		}
		for(var i=0;i<this.errCount;i++){
			try{
	             var span = document.createElement("SPAN");
	             span.id = "__ErrorMessagePanel";
	             span.style.color = "red";
	             this.errItem[i].parentNode.appendChild(span);
	             span.innerHTML = "<BR>*"+this.errMsg[i].substr(0,this.errMsg[i].length-1);
	          }catch(e){alert(e.description);}       
		}
		this.errItem[0].focus();
	}
	//气泡显示错误信息
	this.BubbleShowMsg=function(){
		//只校验一个元素
		if(typeof(theform)=="undefined"){
			this.errItem[0]=this.objElement;
			this.errCount=1;			
		}
		for(var i=0;i<this.errCount;i++){
			try{
	             var span = document.createElement("SPAN");
	             span.id = "__ErrorMessagePanel";
	             span.className="bubbletext";
	             span.style.color="red";
	             span.style.position="absolute";
	             span.style.width="200px";
	             span.style.padding="3px";
	             span.style.background="#f1f1f1";
	             span.style.border="1px solid #8A9DC4";
	             
	             span.onclick=function(){
	             	 this.parentNode.removeChild(this);	
	             }
	            // span.style.color = "red";
	             this.errItem[i].parentNode.appendChild(span);
	
	             span.innerHTML = "*"+this.errMsg[i].substr(0,this.errMsg[i].length-1);
	          }catch(e){alert(e.description);}       
		}
		this.errItem[0].focus();
	}
	
	//校验数据的方法
	this.ValidateForm=function(){
		var vError=false;
		for(var i=0;i<count;i++){
			this.objElement=obj.elements[i];
			vError=!this.ValidateFormElement(this.objElement);
			if(vError){
				this.errItem[this.errCount]=this.objElement;
				this.errCount++;
				this.isError=true;
			}
		}
		
		//有错误信息返回false;校验通过返回true
		if(this.errCount>0){
			this.BubbleShowMsg();
			return false;	
		}
		return true;
		
	}
	//校验单个元素的输入数据的方法
	this.ValidateFormElement=function(objEle){
		this.objElement	=objEle;
		var _verify	=objEle.getAttribute("verify");		
		var _desc		=objEle.getAttribute("desc");
		var vError=false
		if(typeof(_verify) == "object" || typeof(_verify) == "undefined")  return true;
		if (objEle.disabled){return true;}
		this.ClearState(objEle);
		with(objEle){
			//必填项校验
			if(this.isNeedCheck(_verify,"M")){
				if(!this.TestReg(value,".+")){
					this.AddErrorMsg(_desc+"is required"+",");
					vError=true;
				}
			}
			//数字类型校验
			if(this.isNeedCheck(_verify,"N")){
				if(isNaN(value)){
					this.AddErrorMsg(_desc+"must be effective digital "+",");
					vError=true;
				}
			}
			//日期类型校验
			if(this.isNeedCheck(_verify,"D")){
				//日期类型校验
				if (!isDate(value)){					
					this.AddErrorMsg(_desc+"Must be expiry date formats, such as "+today()+",");
					vError=true;
				}
			}
			//长度限制min2max
			if(this.isNeedCheck(_verify,"L")){
				try{
					var minL=objEle.getAttribute("min2max");
					var armin2max=minL.split("-");
					if (value.length<armin2max[0] || value.length>armin2max[1]){
						this.AddErrorMsg(_desc+"长度必须在"+armin2max[0]+"到"+armin2max[1]+"之间,");
						vError=true;
					}
				}catch(e){}				
			}
			//数字范围限制min2max
			if(this.isNeedCheck(_verify,"Range")){
				try{
					var minL=objEle.getAttribute("min2max");
					var armin2max=minL.split("-");
					
					if(isNaN(value)){
						this.AddErrorMsg(_desc+"must be effective digital"+",");
						vError=true;
					}
					if (parseFloat(value)<parseFloat(armin2max[0]) || parseFloat(value)>parseFloat(armin2max[1])){
						this.AddErrorMsg(_desc+"必须在"+armin2max[0]+"到"+armin2max[1]+"之间,");
						vError=true;
					}
				}catch(e){}				
			}
			//英文字符限制
			if(this.isNeedCheck(_verify,"En")){
				if(!this.TestReg(value,"^[A-Za-z]+$")){						
					this.AddErrorMsg(_desc+"Must input English "+",");
					vError=true;
				}
			}
			//中文字符限制
			if(this.isNeedCheck(_verify,"Ch")){
				if(!this.TestReg(value,"^[\u0391-\uFFE5]+$")){						
					this.AddErrorMsg(_desc+"Must input Chinese"+",");
					vError=true;
				}
			}
			//邮箱格式			
			if(this.isNeedCheck(_verify,"email")){
				if(!this.TestReg(value,"^(.+)@(.+)$")){						
					this.AddErrorMsg(_desc+"Must be valid EMail format"+",");
					vError=true;
				}
			}
			//自定义正则表达式
			if(this.isNeedCheck(_verify,"Custom")){
				var regexp=objEle.getAttribute("regexp");
				var Errmsg=objEle.getAttribute("Errmsg");
				if(!this.TestReg(value,regexp)){						
					this.AddErrorMsg(_desc+Errmsg+",");
					vError=true;
				}	
			}
		}
		
		return !vError
	}
	
}
//********************************************************************************
//  功能说明注释：校验Form的表单所有元素有效性                                                        
//  版本号： 1.0.0                                                                
//  开发者： 张伟荣                                                               
//  日  期： 2008-3-30 19:40:21                                               
//  修改者：  如需修改请通知本人                                                                     
//  所作改动简要说明：                                                            
//  其  他：                                                                      
//********************************************************************************

//校验Form的数据有效性
function ValidateFormTest(objfm){
	var testV=new	myValidator(objfm);
	if(testV.ValidateForm()){
		return true;
	}
	//alert("操作失败");
	return false;
}
//CheckFormSubmit为了与ValidateFormTest兼容才这样写
function CheckFormSubmit(fm){
	
	return ValidateFormTest(fm);
}

//********************************************************************************
//  功能说明注释：校验Form的表单元素有效性                        
//  版本号： 1.0.0                                                                
//  开发者： 张伟荣                                                               
//  日  期： 2008-3-30 19:40:21                                               
//  修改者： 如需修改请通知本人
//  所作改动简要说明：                                                            
//  其  他：                                                                      
//********************************************************************************

//校验Form的表单元素有效性
function ValidateItemTest(obj){
	var testV=new	myValidator();
	if(testV.ValidateFormElement(obj)){
		return false
	}else{
		testV.BubbleShowMsg();
		return true;
	}
	return false;
}
//气泡消息提示
function sAlertMsg(obj,msg){
	var lastNode = obj.parentNode.childNodes[obj.parentNode.childNodes.length-1];
	if(lastNode.id == "__ErrorMessagePanel")
	     obj.parentNode.removeChild(lastNode);
	           
	  var span = document.createElement("SPAN");
	  span.id = "__ErrorMessagePanel";
	  span.className="bubbletext";
	  span.style.color="red";
	  span.style.position="absolute";
	  span.style.width="200px";
	  span.style.padding="3px";
	  span.style.background="#f1f1f1";
	  span.style.border="1px solid #8A9DC4";
	  span.onclick=function(){
	       this.parentNode.removeChild(this);	
	   }
	 // span.style.color = "red";
	 obj.parentNode.appendChild(span);	
	 span.innerHTML =msg;		
}

//去掉空格
function Trim(str){
	return str.replace(/(^[\s]*)|([\s]*$)/g, "");
}

//判断是否是数字
function isNumber( NumStr ){
	 if (Trim(NumStr)==""||isNaN(NumStr)) {return false;}
	 return true;
}
//判断时间是否正确
function isDate ( DateString ) {
	var y,m,d,h,n;
	DateString = Trim(DateString);
	var monthDays = new Array (31,28,31,30,31,30,31,31,30,31,30,31);
	var dateSplit = DateString.split("-");
	if (dateSplit.length!=3) return false;
	//进行非数字的判断
	for (var i=0; i<=1; i++) {
		if (dateSplit[i].substring(0,1)=="0") dateSplit[i]=dateSplit[i].substring(1,2);
		if (dateSplit[i]==""||isNaN(dateSplit[i])) return false;
	}
	var t = dateSplit[2].split(" ");
	if (t.length==1) {
		if (dateSplit[2].substring(0,1)=="0") dateSplit[2]=dateSplit[2].substring(1,2);
		if (dateSplit[2]==""||isNaN(dateSplit[2])) return false;
		//进行年月日的分解
		y = parseInt(dateSplit[0]);
		m = parseInt(dateSplit[1]);
		d = parseInt(dateSplit[2]);
		h = 0;
		n = 0;
	} else {
		//判断日期的一段
		d = t[0];
		if (d.substring(0,1)=="0") d=d.substring(1,2);
		if (d==""||isNaN(d)) return false;
		//判断时间的一段
		g = t[1].split(":");
		if (g.length<2||g.length>3) return false;
		if (!(isNumber(g[0])&&isNumber(g[1]))) return false;
		h = parseInt(g[0]);
		n = parseInt(g[1]);
	}
	if ( m==2 ) {
		if ( parseInt(y/400)*400==y ) monthDays[1]=29;
		if ( parseInt(y/4)*4==y&&parseInt(y/100)*100!=y ) monthDays[1]=29;
	}
	//判断各个项目
	if (y<1000||y>3000) return false;
	if (m<0||m>12) return false;
	if (d<0||d>monthDays[m-1]) return false;
	if (h>23||h<0) return false;
	if (n>59||n<0) return false;
	return true;
}
